﻿#ifndef	NIBOOL_ARRAY_H
#define	NIBOOL_ARRAY_H

namespace Navinfo {
namespace IMPAuto {
namespace Util {

/**
	@brief		一个简单的动态Bool数组。不支持push_back等操作，只支持resize操作。
	@details
*/
class DLL_PUBLIC CBoolArray
{
public:
	typedef char	BoolType;

	/**
		@brief			构造函数
		@details
	*/
	CBoolArray();
	
	/**
		@brief			析构函数
		@details
	*/
	~CBoolArray();
	
	/**
		@brief			构造函数
		@details
	*/
	CBoolArray( const CBoolArray &r );
	
	/**
		@brief			构造函数
		@details
	*/
	CBoolArray( CBoolArray &&r );
	
	/**
		@brief			重载操作符
		@details
	*/
	const CBoolArray& operator=( const CBoolArray &r );
	
	/**
		@brief			重载操作符
		@details
	*/
	const CBoolArray& operator=( CBoolArray &&r );
	
	/**
		@brief			取得原始内存地址
		@return			原始内存地址
		@details
	*/
	const uchar* GetRawData() const;
	
	/**
		@brief			取得原始内存地址
		@return			原始内存地址
		@details
	*/
	uchar* GetRawData();
	
	/**
		@brief			取得数组中的元素
		@param [in]		i	数组下标
		@return			
		@details
	*/
	const BoolType at( size_t i ) const;
	
	/**
		@brief			取得数组中的元素
		@param [in]		i	数组下标
		@return			
		@details
	*/
	const BoolType operator[]( size_t i ) const;
	
	/**
		@brief			设置数组中的元素
		@param [in]		b	Bool值
		@param [in]		i	数组下标
		@return			
		@details
	*/
	void SetValue( BoolType b, size_t i );
	
	/**
		@brief			取得数组size
		@return			数组size
		@details
	*/
	size_t size() const;
	
	/**
		@brief			取得数组size
		@return			数组size
		@details
	*/
	size_t Size() const;
	
	/**
		@brief			清除数组内容
		@details
	*/
	void clear();
	
	/**
		@brief			重设数组大小
		@param [in]		s	数组size
		@details
	*/
	void resize( size_t s );
	
	/**
		@brief			工具函数用于计算为了存储uiBitCnt的Bool值所需要的最小字节数
		@param [in]		uiBitCnt	Bool值数量
		@return			所需要的最小字节数
		@details
	*/
	static size_t BitCnt2ByteCnt( size_t uiBitCnt );

	/**
		@brief			重载操作符
		@details
	*/
	bool operator==( const CBoolArray &r ) const;

public:
	uchar				*m_pucCharList;
	size_t				m_uiBitCnt;
};

}	//	namespace Util
}	//	namespace IMPAuto
}	//	namespace Navinfo

#endif	//	NIBOOL_ARRAY_H
